#ifndef _VECTOR_HPP_
#define _VECTOR_HPP_

#include <cmath>

#include "definitions.hpp"

class Vector
{
private:
    real_t  _v[3];
public:
    // конструкторы деструкторы
    Vector()                                      ;
    Vector ( real_t newX, real_t newY,  real_t newZ )    ;
    ~Vector ( void );

    ////////////////////////////////////////////////////////////
    /// Текущее значение координат вектора                   ///
    real_t *v();

    real_t  x() ;
    real_t  y() ;
    real_t  z() ;
    ///  Задание новых координат вектора
    void    x ( real_t newX ) ;
    void    y ( real_t newY ) ;
    void    z ( real_t newZ ) ;
    void    xyz ( real_t newX, real_t newY, real_t newZ );
    void    v ( real_t *v );
    ///    Длина вектора
    real_t length();
    real_t length2(); /// квадрат длины
    ///Скалярное произведение
    real_t  mult ( Vector &vec ) ;
    real_t  cos ( Vector &vec ) ;
    ///  Нормализация вектора к 1
    void normalize();
    /// Нормализация к newLength
    void normalize( real_t newLength );
    /// Сложение вычитание
    Vector operator+= ( Vector const &vec );
    Vector operator+ ( Vector const &vec );
    Vector operator-= ( Vector const &vec );
    Vector operator- ( Vector const &vec );
    Vector operator- ();
    Vector operator+ ();
    /// Присваивание
    Vector operator = ( Vector const &vec );
    /// Векторное произведение
    Vector operator*= ( Vector const &vec );
    Vector operator* ( Vector const &vec );
    ///  Произведение вектора на число
    Vector operator*= ( const real_t N );
    Vector operator* ( const real_t N );

};
//// Вспомогательные функции к Vector
/// Скалярное произведение
real_t multiply ( Vector &vec1,Vector &vec2 );
//* Косинус угла между векторами
real_t cos ( Vector &vec1,Vector &vec2 );
real_t sin ( Vector &vec1,Vector &vec2 );

//  */
#endif
